今天介紹分支 (branch) 和標籤 (tag)。
有的時候我們會故意想讓提交記錄岔開,例如,我在開發新功能的同時也想要修復 bug,但我又希望這兩種工作的工作目錄狀態及提交紀錄可以分開,視情況在兩種工作間切換,此時我們就可以利用岔開的概念,也就是開分支 (branch) 的方式來進行。有了分支,提交記錄就不再是線性的,會開始往左右發展,這就進入了 Git 的第二個維度(左右)。因為分支有點像是樹枝岔開的感覺,所以整個 Git 的提交記錄,我們會稱它是一種樹狀 (tree) 結構。
分支在實務上的操作會給它個名字。在我們的提交記錄還沒有任何分支前,看起來是線性的,我們稱它為主幹分支 (master branch),可以把它想成是 Git 提交記錄樹的樹幹。知道 master
是什麼後就可以解釋前面看過的 HEAD -> master
是什麼意思了。例如下面的例子,表示 HEAD
指標指到 master
分支,它們都位於 ca82a6
提交,用白話說就是:我們現在位於 master
分支的 ca82a6
提交。
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD)
要建立一個分支,我們使用 git branch <name>
這個指令,這個指令只會新增分支,但不會切換過去。例如建立一個分支後會發生什麼事呢?其實它只是多了一個指標,去指向這個新分支最近的一個提交。以上面的例子,假設我在 ca82a6
這個提交新開一個分支 bugfix
,指令是
$ git branch bugfix
然後我們再用 git log --decorate
看一下,會發現最近的提交多了一個 bugfix
的引用,但 HEAD
還是指向 master
。
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> master, origin/master, origin/HEAD, bugfix)
Author: Scott Chacon <schacon@gmail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the verison number
如果要切換到 bugfix
這個分支,我們使用 git checkout <branch>
這個指令。git checkout
先前有出現過,但用途和這裡有點不同。這裡的範例如下:
$ git checkout bugfix
看一下 git log --decorate
的結果,現在 HEAD
指向 bugfix
,表示我們已經位於 bugfix
這個指標了。
commit ca82a6dff817ec66f44342007202690a93763949 (HEAD -> bugfix, origin/master, origin/HEAD, master)
Author: Scott Chacon <schacon@gmail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the verison number
前面這兩個指令可以合成一個,會新建一個分支並且切換過去。
$ git checkout -b bugfix
標籤的用途之一是要標示某個特定提交為發行版本。它有兩種型式,一種是輕量標籤 (lightweight),一種是標註標籤 (annotated tag),標註標籤在建立時可以加上訊息。這兩種標籤在 Git 內部的表示方式似乎有所不同,不過不管是那一種標籤,把它想成是一張貼在提交上的貼紙就可以了。
建立標註標籤的方式如下:
$ git tag -a v1.4 -m "my version 1.4"
標註標籤要加上 -a
的旗標,-m
則是訊息內容,和提交相同,若沒有使用 -m
會跳出文字編輯器畫面用以輸入訊息。這個標籤會「貼」在目前所位於的提交上。若要指定標籤到其他的提交,請加上提交作為參數,例如 git tag -a v1.2 9fceb02
。
如果要建立輕量標籤,不需使用 -a
及 -m
旗標。
$ git tag v1.4-lw
要列出目前所有的標籤,可以使用 git tag
。要輸出符合某一個樣式的標籤,可以用 git tag -l <pattern>
,例如:
$ git tag -l "v1.8.5*"
範例輸出如下:
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5.1
v1.8.5.2
要列出某一個特定標籤的內容,使用 git show <tag>
,例如:
$ git show v1.4
範例輸出如下:
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
要刪除標籤,使用 -d
旗標,例如 git tag -d v1.4-lw
。
今天就先到這裡,我們明天從分支的合併開始看起。